(function ($) {
  'use strict';
  var saturated = {
    saturate: function (a) {
      if (a === Infinity) {
        return Number.MAX_VALUE;
      }

      if (a === -Infinity) {
        return -Number.MAX_VALUE;
      }

      return a;
    },
    delta: function (min, max, noTicks) {
      return ((max - min) / noTicks) === Infinity ? (max / noTicks - min / noTicks) : (max - min) / noTicks
    },
    multiply: function (a, b) {
      return saturated.saturate(a * b);
    },
    // returns c * bInt * a. Beahves properly in the case where c is negative
    // and bInt * a is bigger that Number.MAX_VALUE (Infinity)
    multiplyAdd: function (a, bInt, c) {
      if (isFinite(a * bInt)) {
        return saturated.saturate(a * bInt + c);
      } else {
        var result = c;

        for (var i = 0; i < bInt; i++) {
          result += a;
        }

        return saturated.saturate(result);
      }
    },
    // round to nearby lower multiple of base
    floorInBase: function (n, base) {
      return base * Math.floor(n / base);
    }
  };

  $.plot.saturated = saturated;
})(jQuery);
